/**
 * 真题描述：给定一个非空字符串 s，最多删除一个字符。判断是否能成为回文字符串。
 * 示例：
 *  输入: "aba"
 *  输出: True
 * 示例 2:
 *  输入: "abca"
 *  输出: True
 *  解释: 你可以删除c字符。注意: 字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
 */

/**
 * 双指针对撞 + 对称
 * 1. 双指针 从手和尾 判断移动，如果两次都一样则 两个指针均移动
 * 2. 若值不一样则跳过某指针判断剩下的是否是回文字符串
 */
function validPalindrome(str) {
  // 定义左右指针
  let i = 0
  let j = str.length - 1
  while (i < j && str[i] === str[j]) {
    // 若左右指针指向的两个值都相等 则左指针右移动，右指针左移动
    i++
    j--
  }
  // 指针不再移动的时候
  /**
   * 1. str本身即为回文字符串 此时 i===j 或者 i > j 在判断回文的时候直接返回true
   * 2. 遇到不相等的值
   */
  
  // 跳过一个元素之后再判断是否是回文
  // 左指针跳过一个元素 之后判断回文 如果是 则返回true如果不是再 右指针跳过一个元素 若还不是则直接返回false
  if(isPalindrome(i+1, j)) {
    return true
  }
  if(isPalindrome(i, j-1)) {
    return true
  }
  


  // 定义方法判断回文字符串,收到指针
  function isPalindrome(st, ed) {
    while(st < ed) {
      if (str[st] !== str[ed]) {
        return false
      }
      // 若两个值相等则指针继续移动
      st++
      ed--
    }
    return true
  }
  return false
}

const str1 = 'aba'
const str2 = 'abcaa'
console.log(validPalindrome(str1));
console.log(validPalindrome(str2));
